package com.qf.mvc.controller;

import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("/upload")
@ResponseBody
public class UploadController {
    @Value("${mvc.fileDir}")
    private String fileDir;

    /**
     * @param username 表单中的用户名
     * @param source   表单中上传 文件，需要 与表单中的name属性一致
     * @return
     */
    @RequestMapping("/test1")
    public String test1(String username, MultipartFile source) throws IOException {
        System.out.println(username);
        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();
        // 文件名的生成
        String filePath = createFile(originalFilename);
        final File file = new File(filePath);
        source.transferTo(file);
        return "/hello.jsp";
    }

    private String createFile(String originalFilename) {
        // 生成一个随机的文件名
        final String filename = UUID.randomUUID().toString();
        // 文件扩展名的获取
        final String extension = FilenameUtils.getExtension(originalFilename);
        // 拼装最后的文件路径
        final String finalFilePath = fileDir + filename + "." + extension;
        return finalFilePath;
    }

    /**
     * 测试把上传的文件放到 web应用的 根目录下的uplaod目录中
     *
     * @param username
     * @param source
     * @return
     */
    @RequestMapping("/test2")
    public String test2(String username, MultipartFile source, HttpServletRequest request) throws IOException {
        // 获取 ServletContext 对象的方式
        final ServletContext servletContext = request.getServletContext();
        // 获取 web根目录下的 指定目录的决绝路径
        final String realPath = servletContext.getRealPath("/upload");
        // 判断upload目录是否已经存在，如果不存在，则创建
        final File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();
        // 生成一个随机的文件名
        final String filename = UUID.randomUUID().toString();
        // 文件扩展名的获取
        final String extension = FilenameUtils.getExtension(originalFilename);
        // 拼装最后的文件路径
        final String finalFilePath = realPath + File.separator + filename + "." + extension;

        final File file = new File(finalFilePath);
        source.transferTo(file);
        return "/hello.jsp";
    }
    @RequestMapping("/test3")
    public String test3(String username, MultipartFile source, HttpServletRequest request) throws IOException {
        // 获取 ServletContext 对象的方式
        final ServletContext servletContext = request.getServletContext();
        // 获取 web根目录下的 指定目录的决绝路径
        final String realPath = servletContext.getRealPath("/upload");
        // 判断upload目录是否已经存在，如果不存在，则创建
        final File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();
        // 生成一个随机的文件名
        final String filename = UUID.randomUUID().toString();
        // 文件扩展名的获取
        final String extension = FilenameUtils.getExtension(originalFilename);
        // 拼装最后的文件路径
        final String finalFilePath = realPath + File.separator + filename + "." + extension;

        final File file = new File(finalFilePath);
        source.transferTo(file);
        return "test3成功";
    }
}
